package org.mbcorp.sar.controller;

import java.security.Principal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.mbcorp.sar.model.Actividad;
import org.mbcorp.sar.model.Fase;
import org.mbcorp.sar.model.FiltroBusqueda;
import org.mbcorp.sar.model.Logro;
import org.mbcorp.sar.model.Operador;
import org.mbcorp.sar.service.ActividadService;
import org.mbcorp.sar.service.AlertaService;
import org.mbcorp.sar.service.ArchivoService;
import org.mbcorp.sar.service.FaseService;
import org.mbcorp.sar.service.OperadorService;
import org.mbcorp.sar.service.PuntajeService;
import org.mbcorp.sar.validator.FiltroBusquedaValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.context.MessageSource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@PreAuthorize(value = "hasRole('ROLE_OPERADOR')")
@Controller
public class EjecutarAtencionController {

	@Autowired
    private MessageSource messageSource;
	
	@Autowired
	private FaseService faseService;
	
	@Autowired
	private OperadorService operadorService;
	
	@Autowired
	private ArchivoService archivoService;
	
	@Autowired
	private AlertaService alertaService;
	
	@Autowired
	private ActividadService actividadService;
	
	@Autowired
	private PuntajeService puntajeService;
	
	@Autowired
	private FiltroBusquedaValidator filtroBusquedaValidator;
	
	@InitBinder
	public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) {
	    final String dateformat = this.messageSource.getMessage("date.format", null, locale);
	    final SimpleDateFormat sdf = new SimpleDateFormat(dateformat);
	    sdf.setLenient(false);
	    dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, false));
	}

	@RequestMapping(value = "/consultarAtencion", method = RequestMethod.GET)
	public String cargarAtenciones(FiltroBusqueda filtroBusqueda, Model model, Principal currentUser) {
			List<Fase> listaFasesActivas = faseService.buscarFasesActivasPorOperador(currentUser);
			model.addAttribute("listaFases", listaFasesActivas);
		return "consultarAtencion";
	}
	
	@RequestMapping(value = "/consultarAtencion", method = RequestMethod.POST)
	public String buscarAtenciones(Model model, Principal currentUser, FiltroBusqueda filtroBusqueda, BindingResult result) {
		if(!filtroBusquedaValidator.validarRangoFechas(filtroBusqueda, result)){
			model.addAttribute("flagError", true);
			return "consultarAtencion";
			}
		List<Fase> listaFasesActivas = faseService.buscarFasesActivasPorOperador(filtroBusqueda, currentUser);
		model.addAttribute("listaFases", listaFasesActivas);
		return "consultarAtencion";
	}
	
	@RequestMapping( method=RequestMethod.GET, value="/verDetalleTrabajo/{id}" )
	public ModelAndView getVerDetalleTrabajo(Actividad actividad, Model model,  @PathVariable Integer id ) {
		 	Fase fase = faseService.buscarPorId(id);
		    model.addAttribute( "solicitud", fase.getSolicitud());
	        model.addAttribute( "faseSeleccionada", fase );
	        return new ModelAndView( "detalleTrabajo" );
	    }

	@RequestMapping(value = "/adicionarActividad", method = RequestMethod.POST)
	public String adicionarActividad(@RequestParam("idFase") Integer idFase, Actividad actividad, Model model, Principal currentUser) {
		Fase fase = faseService.buscarPorId(idFase);
		actividadService.registrarNuevaActividad(actividad, fase, operadorService.buscarPorLogin(currentUser.getName()).get(0));
		fase = faseService.buscarPorId(idFase);
		model.addAttribute( "solicitud", fase.getSolicitud());
	    model.addAttribute( "faseSeleccionada", fase );
		return "detalleTrabajo";
	}
	
	@RequestMapping(value = "/abrirArchivo/{archivoId}/{nombreArchivo}", method = RequestMethod.GET)
	@ResponseBody
	public FileSystemResource getFile(@PathVariable("archivoId") Integer archivoId, @PathVariable("nombreArchivo") String nombreArchivo ) {
		System.out.println("recuperando archivo " + archivoId + " ruta: " + archivoService.buscarPorId(archivoId).getRuta());
		FileSystemResource aux = new FileSystemResource(archivoService.buscarPorId(archivoId).getRuta()); 
	    return aux;
	}
	
	@RequestMapping(value = "/verActividad/{idFaseSeleccionada}/{idActividad}", method = RequestMethod.GET)
	public String verActividad(@PathVariable("idActividad") Integer idActividad, @PathVariable("idFaseSeleccionada") Integer idFaseSeleccionada, Model model) {
			Actividad actividad = actividadService.buscarPorId(idActividad);
			model.addAttribute( "faseSeleccionada", faseService.buscarPorId(idFaseSeleccionada));
			model.addAttribute("actividad", actividad);
			model.addAttribute("modoConsulta", true);
			return "registrarActividad";
		}
	
	@RequestMapping(value = "/editarActividad/{idFaseSeleccionada}/{idActividad}", method = RequestMethod.GET)
	public String editarActividad(@PathVariable("idActividad") Integer idActividad, @PathVariable("idFaseSeleccionada") Integer idFaseSeleccionada, Model model) {
			Actividad actividad = actividadService.buscarPorId(idActividad);
			model.addAttribute( "faseSeleccionada", faseService.buscarPorId(idFaseSeleccionada));
			model.addAttribute("actividad", actividad);
			model.addAttribute("modoConsulta", false);
			return "registrarActividad";
		}
	
	@RequestMapping(value = "/grabarActividad", method = RequestMethod.POST)
	public String editarActividad(Actividad actividad, Model model) {
			if(actividad.isFlagCierre()){
				actividad = actividadService.actualizarYCerrarActividad(actividad);
			} else {
				actividad = actividadService.actualizarActividad(actividad);
			}
			Fase fase = faseService.buscarPorId(actividad.getFase().getId());
			model.addAttribute( "solicitud", fase.getSolicitud());
		    model.addAttribute( "faseSeleccionada", fase );
		    model.addAttribute( "confirmaActualizacion", true );
			return "detalleTrabajo";
		}

	@RequestMapping(value = "/cerrarFase", method = RequestMethod.POST)
	public String cerrarFase(Actividad actividad, Model model, @RequestParam("idFase") Integer idFase, Principal currentUser) {
		Fase fase = faseService.buscarPorId(idFase);
		if(fase.getActividades() == null || fase.getActividades().size() == 0){
			model.addAttribute("flagSinActividades", true);
			model.addAttribute( "solicitud", fase.getSolicitud());
		    model.addAttribute( "faseSeleccionada", fase );
			return "detalleTrabajo";
		}
		if(fase.isTieneActividadesAbiertas()){
			model.addAttribute("flagActividadesAbiertas", true);
			model.addAttribute( "solicitud", fase.getSolicitud());
		    model.addAttribute( "faseSeleccionada", fase);
			return "detalleTrabajo";
		}
		fase = faseService.cerrarFase(fase);
		Operador operador = operadorService.buscarPorLogin(currentUser.getName()).get(0);
		int puntajeAntiguo = operador.getPuntajeAcumulado();
		puntajeService.sumarPuntajeFinFase(fase);
		List<Logro> logros = puntajeService.mostrarLogrosFinFase(operador, fase);		
		operador = operadorService.buscarPorLogin(currentUser.getName()).get(0);
		int diferenciaPuntaje = operador.getPuntajeAcumulado() - puntajeAntiguo;
		if(diferenciaPuntaje > 0){
			model.addAttribute("puntajeObtenido", diferenciaPuntaje);
		}
		if(logros.size() > 0){
			model.addAttribute("logrosObtenidos", logros);
		}		
		model.addAttribute( "solicitud", fase.getSolicitud());
	    model.addAttribute( "faseSeleccionada", fase );
	    model.addAttribute( "confirmaCierreFase", true);
	    if(fase.getSolicitud().isTieneFasesAbiertas()){			
			alertaService.alertaFinFase(fase);
		} else {
			alertaService.alertaFinSolicitud(fase.getSolicitud());
		}
		return "detalleTrabajo";
	}
}
